//package com.boot.utils;
//
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONObject;
//import okhttp3.*;
//import org.jetbrains.annotations.NotNull;
//
//import javax.net.ssl.SSLContext;
//import javax.net.ssl.SSLSocketFactory;
//import javax.net.ssl.TrustManager;
//import javax.net.ssl.X509TrustManager;
//import java.io.IOException;
//import java.io.Serializable;
//import java.net.InetSocketAddress;
// import java.net.Proxy;
// import java.net.URLEncoder;
//import java.security.SecureRandom;
//import java.security.cert.X509Certificate;
//import java.util.LinkedHashMap;
//import java.util.Map;
//import java.util.Objects;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.concurrent.Semaphore;
//import java.util.concurrent.TimeUnit;
//
///**
// * @Description: okhttp工具类
// * @author: lh
// */
//public class OkHttpUtils_BAK {
//
//
//    private static final String APPLICATION_JSON_UTF8 = "application/json; charset=utf-8";
//
//    private static volatile ConcurrentHashMap<String, OkHttpClient> okHttpClientMap = new ConcurrentHashMap<>();
//
//    private static volatile OkHttpClient okHttpClient = null;
//    private static volatile Semaphore semaphore = null;
//    private Map<String, String> headerMap;
//    private Map<String, String> paramMap;
//    private String url;
//    private Request.Builder request;
//
//    /**
//     * 初始化okHttpClient，并且允许https访问
//     */
//    private OkHttpUtils_BAK(TimeConfig timeConfig, ProxyConfig proxyConfig, ConnectionPoolConfig poolConfig) {
//        String key = getClientKey(timeConfig, proxyConfig,poolConfig);
//        if (!okHttpClientMap.containsKey(key)) {
//            synchronized (OkHttpClient.class) {
//                if (!okHttpClientMap.containsKey(key)) {
//                    Proxy proxy = null;
//                    // 设置代理方式
//                    if(proxyConfig!=null && proxyConfig.getIp()!=null && proxyConfig.getPort()!=null){
//                         proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyConfig.getIp(), proxyConfig.getPort()));
//                    }
//                    TrustManager[] trustManagers = buildTrustManagers();
//                    okHttpClient = new OkHttpClient.Builder()
//                            //设置连接超时时间
//                            .connectTimeout(timeConfig.getConnectTimeout(), TimeUnit.SECONDS)
//                            //写入超时时间
//                            .writeTimeout(timeConfig.getWriteTimeout(), TimeUnit.SECONDS)
//                            //从连接成功到响应的总时间
//                            .readTimeout(timeConfig.getReadTimeout(), TimeUnit.SECONDS)
//                            //跳过ssl认证(https)
//                            .sslSocketFactory(createSSLSocketFactory(trustManagers), (X509TrustManager) trustManagers[0])
//                            .hostnameVerifier((hostName, session) -> true)
//                            .retryOnConnectionFailure(true)
//                            .proxy(proxy)//代理ip
//                            //设置连接池  最大连接数量  , 持续存活的连接
//                            .connectionPool(new ConnectionPool(5, 5, TimeUnit.MINUTES))
//                            .build();
//                    addHeader("User-Agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36");
//                }
//            }
//        }
//    }
//
//    /**
//     * 用于异步请求时，控制访问线程数，返回结果
//     *
//     */
//    private static Semaphore getSemaphoreInstance() {
//        //只能1个线程同时访问
//        synchronized (OkHttpUtils_BAK.class) {
//            if (semaphore == null) {
//                semaphore = new Semaphore(0);
//            }
//        }
//        return semaphore;
//    }
//
//    /**
//     * 创建OkHttpUtils
//     *
//     */
//    public static OkHttpUtils_BAK builder() {
//        return new OkHttpUtils_BAK(null,null,null);
//    }
//    public static OkHttpUtils_BAK builder(TimeConfig timeConfig, ProxyConfig proxyConfig, ConnectionPoolConfig poolConfig) {
//        return new OkHttpUtils_BAK(null,null,null);
//    }
//
////    /**
////     * 添加url
////     *
////     * @param url 地址
////     */
////    private OkHttpUtils url(String url) {
////        this.url = url;
////        return this;
////    }
////    /**
////     * 添加map参数
////     *
////     * @param reqParamMap
////     */
////    public OkHttpUtils addParam(Map<String, String> reqParamMap) {
////        if (paramMap == null) {
////            paramMap = new LinkedHashMap<>(16);
////        }
////        paramMap.putAll(reqParamMap);
////        return this;
////    }
////    /**
////     * 添加参数
////     *
////     * @param key   参数名
////     * @param value 参数值
////     */
////    private OkHttpUtils addParam(String key, String value) {
////        if (paramMap == null) {
////            paramMap = new LinkedHashMap<>(16);
////        }
////        paramMap.put(key, value);
////        return this;
////    }
//
//    /**
//     * 添加请求头
//     *
//     * @param key   参数名
//     * @param value 参数值
//     */
//    private OkHttpUtils_BAK addHeader(String key, String value) {
//        if (headerMap == null) {
//            headerMap = new LinkedHashMap<>(16);
//        }
//        headerMap.put(key, value);
//        return this;
//    }
//
//    /**
//     * 初始化get方法
//     *
//     */
//    public OkHttpUtils_BAK get() {
//        request = new Request.Builder().get();
//        StringBuilder urlBuilder = new StringBuilder(url);
//        if (paramMap != null) {
//            urlBuilder.append("?");
//            try {
//                for (Map.Entry<String, String> entry : paramMap.entrySet()) {
//                    urlBuilder.append(URLEncoder.encode(entry.getKey(), "utf-8")).
//                            append("=").
//                            append(URLEncoder.encode(entry.getValue(), "utf-8")).
//                            append("&");
//                }
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//            urlBuilder.deleteCharAt(urlBuilder.length() - 1);
//        }
//        request.url(urlBuilder.toString());
//        return this;
//    }
//
//
//    /**
//     * 初始化post方法
//     *
//     * @param isJsonPost true等于json的方式提交数据，类似postman里post方法的raw
//     *                   false等于普通的表单提交
//     */
//    public OkHttpUtils_BAK post(boolean isJsonPost) {
//        RequestBody requestBody;
//        if (isJsonPost) {
//            String json = "";
//            if (paramMap != null) {
//                json = JSON.toJSONString(paramMap);
//            }
//            requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
//        } else {
//            FormBody.Builder formBody = new FormBody.Builder();
//            if (paramMap != null) {
//                paramMap.forEach(formBody::add);
//            }
//            requestBody = formBody.build();
//        }
//        request = new Request.Builder().post(requestBody).url(url);
//        return this;
//    }
//
////    public OkHttpUtils put() {
////        String json = "";
////        if (paramMap != null) {
////            json = JSON.toJSONString(paramMap);
////        }
////        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
////
////        request = new Request.Builder().put(requestBody).url(url);
////        return this;
////    }
////
////    public OkHttpUtils del() {
////        String json = "";
////        if (paramMap != null) {
////            json = JSON.toJSONString(paramMap);
////        }
////        RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), json);
////        request = new Request.Builder().delete(requestBody).url(url);
////        return this;
////    }
////
//    /**
//     * 同步请求
//     *
//     */
//    public HttpResult sync() {
//        setHeader(request);
//        try {
//            Response response = okHttpClient.newCall(request.build()).execute();
//            assert response.body() != null;
//            if(response.body()==null){
//                return new HttpResult(false,"response body is null");
//            }
//            return new HttpResult(true,response.body().string());
//        } catch (IOException e) {
//            // todo print
//            e.printStackTrace();
//            return new HttpResult(false,e.getMessage(),e);
//        }
//    }
//
//    /**
//     * 异步请求，有返回值
//     */
//    public HttpResult async() {
//        HttpResult httpResult = new HttpResult();
//        StringBuilder buffer = new StringBuilder("");
//        setHeader(request);
//        okHttpClient.newCall(request.build()).enqueue(new Callback() {
//            @Override
//            public void onFailure(@NotNull Call call, @NotNull IOException e) {
//                buffer.append("请求出错：").append(e.getMessage());
//                httpResult.setSuccess(false);
//                httpResult.setMsg(buffer.toString());
//            }
//
//            @Override
//            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
//                assert response.body() != null;
//                buffer.append(Objects.requireNonNull(response.body()).string());
//                getSemaphoreInstance().release();
//                httpResult.setSuccess(true);
//                httpResult.setMsg(buffer.toString());
//            }
//        });
//        try {
//            getSemaphoreInstance().acquire();
//        } catch (InterruptedException e) {
//            httpResult.setSuccess(false);
//            httpResult.setMsg(buffer.toString());
//            httpResult.setE(e);
//        }
//        return httpResult;
//    }
//
//    /**
//     * 异步请求，带有接口回调
//     *
//     * @param callBack 回调
//     */
//    public void async(ICallBack callBack) {
//        setHeader(request);
//        okHttpClient.newCall(request.build()).enqueue(new Callback() {
//            @Override
//            public void onFailure(@NotNull Call call, @NotNull IOException e) {
//                callBack.onFailure(call, e.getMessage());
//            }
//
//            @Override
//            public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
//                if(response.body() != null){
//                    callBack.onFailure(call, "response body is null");
//                }else{
//                    callBack.onSuccessful(call,(response.body().string();
//                }
//            }
//        });
//    }
//
//    /**
//     * 为request添加请求头
//     *
//     * @param request 请求
//     */
//    private void setHeader(Request.Builder request) {
//        if (headerMap != null) {
//            try {
//                for (Map.Entry<String, String> entry : headerMap.entrySet()) {
//                    request.addHeader(entry.getKey(), entry.getValue());
//                }
//            } catch (Exception e) {
//                e.printStackTrace();
//            }
//        }
//    }
//
//
//    /**
//     * 生成安全套接字工厂，用于https请求的证书跳过
//     *
//     * @return SSLSocketFactory
//     */
//    private static SSLSocketFactory createSSLSocketFactory(TrustManager[] trustAllCerts) {
//        SSLSocketFactory ssfFactory = null;
//        try {
//            SSLContext sc = SSLContext.getInstance("SSL");
//            sc.init(null, trustAllCerts, new SecureRandom());
//            ssfFactory = sc.getSocketFactory();
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        return ssfFactory;
//    }
//
//    private static TrustManager[] buildTrustManagers() {
//        return new TrustManager[]{
//                new X509TrustManager() {
//                    @Override
//                    public void checkClientTrusted(X509Certificate[] chain, String authType) {
//                    }
//
//                    @Override
//                    public void checkServerTrusted(X509Certificate[] chain, String authType) {
//                    }
//
//                    @Override
//                    public X509Certificate[] getAcceptedIssuers() {
//                        return new X509Certificate[]{};
//                    }
//                }
//        };
//    }
//
//    public HttpResult postJson(String url, JSONObject jsonObject) {
//        request = new Request.Builder().post(RequestBody.create(MediaType.parse(APPLICATION_JSON_UTF8), jsonObject.toJSONString())).url(url);
//        return async();
//    }
//
//
//    public HttpResult postJsonAsync(String url, JSONObject jsonObject) {
//        request = new Request.Builder().post(RequestBody.create(MediaType.parse(APPLICATION_JSON_UTF8), jsonObject.toJSONString())).url(url);
//        return sync();
//    }
//
//
//    /**
//     * 自定义一个接口回调 - 发送异步请求时可以实现这个接口
//     */
//    public interface ICallBack {
//        /**
//         * 接口正常调用返回的内容
//         *
//         * @param call 回调
//         * @param data 返回数据
//         */
//        void onSuccessful(Call call, String data);
//
//        /**
//         * 接口错误返回的内容
//         *
//         * @param call     回调
//         * @param errorMsg 错误信息
//         */
//        void onFailure(Call call, String errorMsg);
//
//    }
//
//    private String getClientKey(TimeConfig timeConfig, ProxyConfig proxyConfig, ConnectionPoolConfig poolConfig) {
//        return getTimeConfigKey(timeConfig)+ "_" + getProxyKey(proxyConfig)+getPoolConfigKey(poolConfig) ;
//    }
//    private String getTimeConfigKey(TimeConfig timeConfig) {
//        return timeConfig.getConnectTimeout() + "_" + timeConfig.getReadTimeout() + "_" + timeConfig.getWriteTimeout();
//    }
//
//    private String getProxyKey(ProxyConfig proxyConfig) {
//        return proxyConfig == null ? "null" :  proxyConfig.getIp()+proxyConfig.getPort();
//    }
//
//    private String getPoolConfigKey(ConnectionPoolConfig timeConfig) {
//        return timeConfig.getMaxIdleConnections() + "_" + timeConfig.getKeepAliveDuration() + "_" + timeConfig.getTimeUnit().name();
//    }
//
//    private static class TimeConfig {
//        private int connectTimeout;
//        private int writeTimeout;
//        private int readTimeout;
//
//        public TimeConfig(int connectTimeout, int writeTimeout, int readTimeout) {
//            this.connectTimeout = connectTimeout;
//            this.writeTimeout = writeTimeout;
//            this.readTimeout = readTimeout;
//        }
//
//        public int getConnectTimeout() {
//            return connectTimeout;
//        }
//
//        public int getWriteTimeout() {
//            return writeTimeout;
//        }
//
//        public int getReadTimeout() {
//            return readTimeout;
//        }
//    }
//
//
//    private static class ConnectionPoolConfig {
//        private int maxIdleConnections;
//        private int keepAliveDuration;
//        private TimeUnit timeUnit;
//
//        public ConnectionPoolConfig(int maxIdleConnections, int keepAliveDuration, TimeUnit timeUnit) {
//            this.maxIdleConnections = maxIdleConnections;
//            this.keepAliveDuration = keepAliveDuration;
//            this.timeUnit = timeUnit;
//        }
//
//        public int getMaxIdleConnections() {
//            return maxIdleConnections;
//        }
//
//        public int getKeepAliveDuration() {
//            return keepAliveDuration;
//        }
//
//        public TimeUnit getTimeUnit() {
//            return timeUnit;
//        }
//    }
//
//    private static class ProxyConfig {
//        private String ip;
//        private Integer port;
//
//        public ProxyConfig(String ip, Integer port) {
//            this.ip = ip;
//            this.port = port;
//        }
//
//        public String getIp() {
//            return ip;
//        }
//
//        public Integer getPort() {
//            return port;
//        }
//    }
//
//    public class HttpResult implements Serializable {
//
//        private static final long serialVersionUID = -7932267115746602337L;
//        private boolean success;
//        private String msg;
//        private Exception e;
//
//        public HttpResult(boolean success, String msg) {
//            this.success = success;
//            this.msg = msg;
//        }
//        public HttpResult(boolean success, String msg,Exception e) {
//            this.success = success;
//            this.msg = msg;
//            this.e = e;
//        }
//
//        public boolean isSuccess() {
//            return success;
//        }
//
//        public void setSuccess(boolean success) {
//            this.success = success;
//        }
//
//        public String getMsg() {
//            return msg;
//        }
//
//        public void setMsg(String msg) {
//            this.msg = msg;
//        }
//
//        public Exception getE() {
//            return e;
//        }
//
//        public void setE(Exception e) {
//            this.e = e;
//        }
//
//        public HttpResult() {
//
//        }
//    }
//
//}